package com.reservation.controller.auth;

import com.reservation.constant.MessageConstant;
import com.reservation.dto.auth.GetInfoDTO;
import com.reservation.dto.auth.LoginDTO;
import com.reservation.dto.auth.RegisterDTO;
import com.reservation.result.Result;
import com.reservation.service.AuthService;
import com.reservation.utils.CurrentHolderUtil;
import com.reservation.vo.auth.AvatarVO;
import com.reservation.vo.auth.LoginVO;
import com.reservation.vo.auth.UserInfoVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;


/**
 * 用户相关接口
 */
@Api(tags = "用户相关接口")
@RestController
@RequestMapping("/api/users")
@Slf4j
public class AuthController {

    @Autowired
    private AuthService authService;

    /**
     * 用户注册
     * @param registerDTO 注册信息
     * @return 用户信息
     */
    @PostMapping("/register")
    public Result<String> register(@RequestBody RegisterDTO registerDTO) {
        log.info("用户注册：{}", registerDTO);
        
        // 调用业务层完成注册
        authService.register(registerDTO);

        return Result.success(MessageConstant.REGISTER_SUCCESS);
    }


    /**
     * 用户登录
     * @param loginDTO 登录信息
     * @return 登录结果(token + 用户信息)
     */
    @PostMapping("/login")
    @ApiOperation("用户登录")
    public Result<LoginVO> login(@RequestBody LoginDTO loginDTO) {
        log.info("用户登录：{}", loginDTO);

        // 调用业务层完成登录
        LoginVO userLoginVO = authService.login(loginDTO);

        return Result.success(MessageConstant.LOGIN_SUCCESS, userLoginVO);
    }

    /**
     * 获取用户信息
     * @return 用户信息
     */
    @PostMapping("/getInfo")
    @ApiOperation("获取用户信息")
    public Result<UserInfoVO> getUserInfo() {
        // 从当前上下文获取用户账号
        Integer userId = CurrentHolderUtil.getCurrentId();
        if (userId == null) {
            return Result.error("用户未登录");
        }

        // 通过用户ID获取用户信息
        UserInfoVO userInfoVO = authService.getUserInfoById(userId);

        return Result.success(userInfoVO);
    }    /**
     * 更换头像
     *
     * @param file 头像文件
     * @return 更换结果，包含新头像的完整 URL
     */
    @PostMapping("/changeAvatar")
    @ApiOperation("更换头像")
    public Result<AvatarVO> changeAvatar(@RequestParam("avatar") MultipartFile file) {
        log.info("更换头像");
        if (file.isEmpty()) {
            return Result.error("上传文件不能为空");
        }
        // authService.changeAvatar(file) 返回的是完整的 URL
        String avatarUrl = authService.changeAvatar(file);
        // 封装为 AvatarVO 对象返回
        AvatarVO avatarVO = AvatarVO.builder()
                .avatarURL(avatarUrl)
                .build();
        return Result.success("头像更换成功", avatarVO);
    }

    /**
     * 用户注销
     * @return 注销结果
     */
    @PostMapping("/logout")
    @ApiOperation("注销账号")
    public Result<String> logout() {
        log.info("用户注销");
        
        // 从当前上下文获取用户账号
        Integer userId = CurrentHolderUtil.getCurrentId();
        if (userId == null) {
            return Result.error("用户未登录");
        }

        // 调用业务层完成注销
        authService.logout(userId);

        return Result.success(MessageConstant.LOGOUT_SUCCESS);
    }
}




